'''
Created on 07/09/2013

@author: daniel
'''
import unittest
import directorio
import colecciones.arbolGeneral
import colecciones.listaEnlazada
import colecciones.cola

class Empresa(colecciones.arbolGeneral.ArbolGeneral):
    
    def trabajadoresPorCategoria(self):
        cola=colecciones.cola.Cola()
        cola.poner(self)
        lista=colecciones.listaEnlazada.ListaEnlazada()
        while not cola.esVacia():
            arbol = cola.sacar()
            lista.agregar(arbol.getDatoRaiz(), lista.getTamanio())
            rec_hijos = arbol.getHijos().recorredor()
            rec_hijos.comenzar()
            while not rec_hijos.fin():
                cola.poner(rec_hijos.elemento())
                rec_hijos.proximo()
        return lista

    
    def categoriaConMasTrabajadores(self):
        return self.__nivelConMasSubordinados()+2

    def __nivelConMasSubordinados(self):
        if(self.getHijos().esVacia()):return 0
        i=cant=nivel=0
        maxCant=self.getHijos().getTamanio()
        while (i<self.getHijos().getTamanio()):
            if(self.getHijos().elemento(i).getHijos().esVacia()==False):
                cant+=self.getHijos().elemento(i).getHijos().getTamanio()
            nivel=self.getHijos().elemento(i).__nivelConMasSubordinados()
            i+=1
        if(nivel!=0):return nivel+1
        if(cant>maxCant):return 1
        return 0
        

    def cantidadTotalDeTrabajadores(self):
        if(self.getHijos().esVacia()):return 0
        cant=i=0
        while (i<self.getHijos().getTamanio()):
            if(self.getHijos().elemento(i).getHijos().esVacia()==False):
                cant+=self.getHijos().elemento(i).getHijos().getTamanio()+1
            cant+=self.getHijos().elemento(i).cantidadTotalDeTrabajadores()
            i+=1
        return cant
    
    
    
    def reemplazarPresidente(self):
        if(self.getHijos().esVacia()): return None
        pos=None
        i=maxAnt=0
        while (i<self.getHijos().getTamanio()):
            ant=self.getHijos().elemento(i).getDatoRaiz().getAntiguedad()
            if(ant>maxAnt): 
                pos=i
                maxAnt=ant
            i+=1
        
        interc=self.getHijos().elemento(pos).getRaiz().getDato()
        sobra=self.getRaiz().getDato()
        self.getRaiz().setDato(interc)
        self.getHijos().elemento(pos).getRaiz().setDato(sobra)
        
        self.getHijos().elemento(pos).reemplazarPresidente()

        if(self.getHijos().elemento(pos).getHijos().esVacia()):self.getHijos().eliminar(pos)
        
        
        return interc
           

    
    
class Test(unittest.TestCase):


    def testInit(self):
        self.assertIsInstance(Empresa(directorio.Directorio("Daniel",8)), Empresa, "Verifica la correcta creacion de la empresa")
    
    def testTrabajadoresPorCategoria(self):
        emp1=directorio.Directorio("presidente",12)
        emp2=directorio.Directorio("vicepres",9)
        emp3=directorio.Directorio("gerente3",8)
        emp4=directorio.Directorio("gerente4",9)
        emp5=directorio.Directorio("gerente5",10)
        emp6=directorio.Directorio("gerente6",11)
        obj=Empresa(emp1)
        obj.agregarHijo(Empresa(emp2))
        aux=obj.getRaiz()
        obj.setRaiz(obj.getHijos().elemento(0).getRaiz())
        obj.agregarHijo(Empresa(emp3))
        obj.agregarHijo(Empresa(emp4))
        obj.agregarHijo(Empresa(emp5))
        obj.agregarHijo(Empresa(emp6))
        obj.setRaiz(obj.getHijos().elemento(0).getRaiz())
        obj.agregarHijo(Empresa(directorio.Directorio("supervisor1",11)))
        obj.agregarHijo(Empresa(directorio.Directorio("supervisor2",11)))
        obj.agregarHijo(Empresa(directorio.Directorio("supervisor3",11)))
        obj.agregarHijo(Empresa(directorio.Directorio("supervisor4",11)))
        obj.agregarHijo(Empresa(directorio.Directorio("supervisor5",11)))
        obj.setRaiz(aux)
        #print len(obj.trabajadoresPorCategoria())
        print obj.trabajadoresPorCategoria()
        self.assertEquals(obj.trabajadoresPorCategoria().elemento(0).getNombre(),emp1.getNombre(), "Verifica contenidos iguales")
        self.assertEquals(obj.trabajadoresPorCategoria().elemento(1).getNombre(),emp2.getNombre(), "Verifica contenidos iguales")
        self.assertEquals(obj.trabajadoresPorCategoria().elemento(2).getNombre(),emp3.getNombre(), "Verifica contenidos iguales")
        self.assertEquals(obj.trabajadoresPorCategoria().elemento(3).getNombre(),emp4.getNombre(), "Verifica contenidos iguales")
        self.assertEquals(obj.trabajadoresPorCategoria().elemento(4).getNombre(),emp5.getNombre(), "Verifica contenidos iguales")
        self.assertEquals(obj.trabajadoresPorCategoria().elemento(5).getNombre(),emp6.getNombre(), "Verifica contenidos iguales")

    def testCategoriaConMasTrabajadores(self):
        emp1=directorio.Directorio("presidente",12)
        emp2=directorio.Directorio("vicepres",9)
        emp3=directorio.Directorio("gerente3",8)
        emp4=directorio.Directorio("gerente4",9)
        emp5=directorio.Directorio("gerente5",10)
        emp6=directorio.Directorio("gerente6",11)
        obj=Empresa(emp1)
        obj.agregarHijo(Empresa(emp2))
        aux=obj.getRaiz()
        obj.setRaiz(obj.getHijos().elemento(0).getRaiz())
        obj.agregarHijo(Empresa(emp3))
        obj.agregarHijo(Empresa(emp4))
        obj.agregarHijo(Empresa(emp5))
        obj.agregarHijo(Empresa(emp6))
        obj.setRaiz(obj.getHijos().elemento(0).getRaiz())
        obj.agregarHijo(Empresa(directorio.Directorio("supervisor1",11)))
        obj.agregarHijo(Empresa(directorio.Directorio("supervisor2",11)))
        obj.agregarHijo(Empresa(directorio.Directorio("supervisor3",11)))
        obj.agregarHijo(Empresa(directorio.Directorio("supervisor4",11)))
        obj.agregarHijo(Empresa(directorio.Directorio("supervisor5",11)))
        obj.setRaiz(aux)
        self.assertEquals(obj.categoriaConMasTrabajadores(),4,"verifica la categoria de los supervisores")
    
    def testCantidadTotalDeTrabajadores(self):
        emp1=directorio.Directorio("presidente",12)
        emp2=directorio.Directorio("vicepres",9)
        emp3=directorio.Directorio("gerente3",8)
        emp4=directorio.Directorio("gerente4",9)
        emp5=directorio.Directorio("gerente5",10)
        emp6=directorio.Directorio("gerente6",11)
        obj=Empresa(emp1)
        obj.agregarHijo(Empresa(emp2))
        aux=obj.getRaiz()
        obj.setRaiz(obj.getHijos().elemento(0).getRaiz())
        obj.agregarHijo(Empresa(emp3))
        obj.agregarHijo(Empresa(emp4))
        obj.agregarHijo(Empresa(emp5))
        obj.agregarHijo(Empresa(emp6))
        obj.setRaiz(obj.getHijos().elemento(0).getRaiz())
        obj.agregarHijo(Empresa(directorio.Directorio("supervisor1",11)))
        obj.agregarHijo(Empresa(directorio.Directorio("supervisor2",11)))
        obj.agregarHijo(Empresa(directorio.Directorio("supervisor3",11)))
        obj.agregarHijo(Empresa(directorio.Directorio("supervisor4",11)))
        obj.agregarHijo(Empresa(directorio.Directorio("supervisor5",11)))
        obj.setRaiz(aux)
        #print obj.cantidadTotalDeTrabajadores()
        self.assertEquals(obj.cantidadTotalDeTrabajadores(),11,"verifica la cantidad de empleados")

    def testReemplazarPresidente(self):
        emp1=directorio.Directorio("presidente",13)
        emp2=directorio.Directorio("vicepres",12)
        emp3=directorio.Directorio("gerente3",11)
        emp4=directorio.Directorio("gerente4",10)
        emp5=directorio.Directorio("gerente5",9)
        emp6=directorio.Directorio("gerente6",8)
        obj=Empresa(emp1)
        obj.agregarHijo(Empresa(emp2))
        aux=obj.getRaiz()
        obj.setRaiz(obj.getHijos().elemento(0).getRaiz())
        obj.agregarHijo(Empresa(emp3))
        obj.agregarHijo(Empresa(emp4))
        obj.agregarHijo(Empresa(emp5))
        obj.agregarHijo(Empresa(emp6))
        obj.setRaiz(obj.getHijos().elemento(0).getRaiz())
        obj.agregarHijo(Empresa(directorio.Directorio("supervisor1",6)))
        obj.agregarHijo(Empresa(directorio.Directorio("supervisor2",5)))
        obj.agregarHijo(Empresa(directorio.Directorio("supervisor3",4)))
        obj.agregarHijo(Empresa(directorio.Directorio("supervisor4",3)))
        obj.agregarHijo(Empresa(directorio.Directorio("supervisor5",2)))
        obj.setRaiz(aux)
        self.assertEquals(obj.cantidadTotalDeTrabajadores(),11,"verifica la cantidad de empleados")
        oper=obj.reemplazarPresidente()
        #print obj.getDatoRaiz().getNombre()
        self.assertEquals(oper.getNombre(), "vicepres","Se verifica devolucion de la funcio reemplazarPresidente")
        self.assertEquals(obj.getDatoRaiz().getNombre(), "vicepres","Se verifica presidente nuevo")
        #print obj.getHijos().elemento(0).getDatoRaiz().getNombre()
        self.assertEquals(obj.getHijos().elemento(0).getRaiz().getNombre(), "gerente3","Se verifica vice nuevo")
        #print obj.cantidadTotalDeTrabajadores()
        self.assertEquals(obj.cantidadTotalDeTrabajadores(),10,"verifica la cantidad de empleados cambio")
        self.assertEquals(emp1.getAntiguedad(), 12, "Verifica que el presidente ha cambiado")
            

if __name__ == "__main__":
    #import sys;sys.argv = ['', 'Test.testName']
    unittest.main()